python thread
taskを投げる時(外部apiに投げるとか )に。 最終的に celery を使うにしても、より簡便な方法をしっておきたい。 code:python
import threading
# Thread()が threadオブジェクトをコンストラクトする
my_thread= threading.Thread(target = lambda x: print("Hello, {}".format(x)), args = ('world')) my_thread.start()
my_thread.is_alive()
start()が、threadオブジェクト作成時の target( callable のもの, 関数)を run()させる、そういうメソッド。
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
公式docの孫引きだけど。SOのがわかりやすい。
code:python
import threading
threading.active_count()
独自クラス(機能)を作成する方法
In other words, only override the __init__() and run() methods of this class.
__init__ run をオーバーライドして作成してる。
こちらは、 stop()メソッドを作って、threadの停止機能をいれてる。
threading.Event()で、theadにイベントを起こす?
フラグを外から更新してあげることで実現可能です。
If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as an Event.
基本的なAPI
join
たいてい)メインスレッドで、あるスレッドのjoin()を呼ぶ。 そのスレッドが終了するまで、メインスレッドは待つ(ブロックされる)
code: thread_join.py
thread = Thread()
thread.join() # ここで、メインスレッドはブロック, threadが終了すればブロック解除
キューに入ったスレッドに、joinをiterateして書けて、スレッドの終了を待つみたいな形ができる。
下は、イメージしやすい。
整理されてる
これがわかりやすいかも。
なんで、joinというワードなのかな...と思ったけど、終わるの待ってるから、早く来いよ、みたいなイメージか。
スレッドのキュー管理のイメージが少し湧いてきた。